/*
 * Universidad del Valle de Guatemala
 * Joseph Christopher Luttmann von Ahn
 * Carnet: 10048
 * Seccion: 20
 */

/**
 * Universidad del Valle de Guatemala
 * @author Christopher Luttmann
 */
import java.util.Scanner;
import java.util.InputMismatchException;
public class DriverPila {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // Declaracion de objetos y variables
        Lista<Double> mi_operando = new Lista<Double>();
        Scanner entrada = new Scanner(System.in);
        int oper1; 
        double op1, op2, op3;
        String op4;
        char op5;
        do{
         menu();
         oper1 = (int)obtenerNumero("Ingrese una opcion del Menu: ", true);
         switch(oper1){
             case 1:
                 op1 = obtenerNumero("Ingrese un numero real: ", true);
                 mi_operando.push(op1);
                 System.out.println(mi_operando);
                 break;
             case 2:
                 System.out.println("Ingrese la operacion que desea realizar (+,-,*,/): ");
                 op4 = entrada.nextLine();
                 op5 = op4.charAt(0);
                 switch(op5){
                     case '+':
                         op1 = mi_operando.pop();
                         op2 = mi_operando.peek();
                         op3 = op2 + op1;
                         mi_operando.push(op1);
                         mi_operando.push(op3);                         
                         break;
                     case '*':
                         op1 = mi_operando.pop();
                         op2 = mi_operando.peek();
                         op3 = op2 * op1;
                         mi_operando.push(op1);
                         mi_operando.push(op3);
                         break;
                     case '-':
                         op1 = mi_operando.pop();
                         op2 = mi_operando.peek();
                         op3 = op2 - op1;
                         mi_operando.push(op1);
                         mi_operando.push(op3);
                         break;
                     case '/':
                         op1 = mi_operando.pop();
                         op2 = mi_operando.peek();
                         op3 = op2 / op1;
                         mi_operando.push(op1);
                         mi_operando.push(op3);
                         break;
                     default:
                         System.out.println("Operacion ingresada incorrecta o inexistente");
                 }
                 System.out.println(mi_operando);
                 break;
             case 3:
                 if(mi_operando.empty() == false){
                     mi_operando.pop();
                     System.out.println(mi_operando);
                 }
                 else{
                     System.out.println("La Pila esta vacia. \nNo puede eliminar elementos\n");
                 }
                 break;
             case 4:
                 System.out.println("Orale.. buena onda por participar!!!");
                 break;
             default:
                 System.out.println("Ingreso no se encuentra en el menu");
         }
        }while(oper1 != 4);
        
    }
    
        /**
        * Imprime el menu de opciones 
        * 
        */
    public static void menu(){
	System.out.println("*----------------------------* ");
	System.out.println("*             Menu           * ");
	System.out.println("*----------------------------* ");
	System.out.println("1. Ingresar numero             ");
	System.out.println("2. Operacion de ingreso        ");
	System.out.println("3. Eliminar ingreso anterior   ");
        System.out.println("4. Finalizar programa          ");
        System.out.println("                               ");
    }
	/**
        * solicita al usuario que ingrese un dato valido
        * en caso contrario manda una excepcion y le indica al usuario
        * que el dato ingresado es incorrecto. 
        * @param mensaje
        * @param mostrar   
        */
    public static double obtenerNumero(String mensaje, boolean mostrar){
        Scanner ingreso = new Scanner(System.in);
        double num = -1;
        
        System.out.print(mensaje);
        try{
            num = ingreso.nextDouble();
        }
        catch(InputMismatchException exception){
            if (mostrar)
                System.out.println("\nERROR: ~~> Dato invalido. :O(\n");
        }
        finally{
            ingreso.nextLine();//Atrapar el ENTER
        }
        return num;
    }
}
